这段代码是Haru Free PDF Library中关于内存管理（Memory Manager）的头文件 `hpdf_mmgr.h`。它定义了内存管理器的数据结构、函数原型和类型定义。以下是对代码的详细解释：

1. **版权声明**：注释块提供了Haru PDF库的版权信息。

2. **宏定义**：`#ifndef _HPDF_MMGR_H` 和 `#define _HPDF_MMGR_H` 用于防止头文件被多次包含。

3. **包含其他头文件**：
   - `#include "hpdf_types.h"` 包含了Haru PDF库的基本类型定义。
   - `#include "hpdf_error.h"` 包含了错误处理的类型定义。

4. **C++兼容性**：条件编译指令，确保当使用C++编译器时，这些函数以C的方式进行链接。

5. **内存池节点结构体定义**：
   - `_HPDF_MPool_Node_Rec` 结构体定义了内存池节点的属性，包括缓冲区指针、大小、已使用大小和指向下一个节点的指针。

6. **内存管理器类型定义**：
   - `HPDF_MMgr` 是指向 `_HPDF_MMgr_Rec` 结构体的指针，表示内存管理器。

7. **内存管理器记录结构体定义**：
   - `_HPDF_MMgr_Rec` 结构体定义了内存管理器的属性，包括错误处理、分配函数、释放函数、内存池节点和缓冲区大小。

8. **内存管理器操作函数原型**：
   - `HPDF_MMgr_New`：创建一个新的内存管理器对象。
   - `HPDF_MMgr_Free`：释放内存管理器资源。
   - `HPDF_GetMem`：从内存管理器分配内存。
   - `HPDF_FreeMem`：释放内存管理器分配的内存。

9. **内存调试宏定义**：
   - `HPDF_MEM_DEBUG`：在调试模式下，定义了内存分配和释放的计数器。

10. **结束C++兼容性条件编译**：`#ifdef __cplusplus` 和 `#endif /* __cplusplus */` 结束C++兼容性代码块。

11. **结束宏定义**：`#endif /* _HPDF_MMGR_H */` 结束头文件的宏定义。

这个头文件提供了Haru PDF库的内存管理功能，包括创建内存管理器、分配和释放内存。通过内存管理器，Haru可以有效地管理PDF文档创建过程中的内存使用，避免内存泄漏和其他内存相关的问题。/*
 * << Haru Free PDF Library >> -- hpdf_mmgr.h
 *
 * URL: http://libharu.org
 *
 * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
 * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.
 * It is provided "as is" without express or implied warranty.
 *
 */

#ifndef _HPDF_MMGR_H
#define _HPDF_MMGR_H

#include "hpdf_types.h"
#include "hpdf_error.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct  _HPDF_MPool_Node_Rec  *HPDF_MPool_Node;

typedef struct  _HPDF_MPool_Node_Rec {
    HPDF_BYTE*       buf;
    HPDF_UINT        size;
    HPDF_UINT        used_size;
    HPDF_MPool_Node  next_node;
} HPDF_MPool_Node_Rec;


typedef struct  _HPDF_MMgr_Rec  *HPDF_MMgr;

typedef struct  _HPDF_MMgr_Rec {
    HPDF_Error        error;
    HPDF_Alloc_Func   alloc_fn;
    HPDF_Free_Func    free_fn;
    HPDF_MPool_Node   mpool;
    HPDF_UINT         buf_size;

#ifdef HPDF_MEM_DEBUG
    HPDF_UINT         alloc_cnt;
    HPDF_UINT         free_cnt;
#endif
} HPDF_MMgr_Rec;


/*  HPDF_mpool_new
 *
 *  create new HPDF_mpool object. when memory allocation goes wrong,
 *  it returns NULL and error handling function will be called.
 *  if buf_size is non-zero, mmgr is configured to be using memory-pool
 */
HPDF_MMgr
HPDF_MMgr_New  (HPDF_Error       error,
                HPDF_UINT        buf_size,
                HPDF_Alloc_Func  alloc_fn,
                HPDF_Free_Func   free_fn);


void
HPDF_MMgr_Free  (HPDF_MMgr  mmgr);


void*
HPDF_GetMem  (HPDF_MMgr  mmgr,
              HPDF_UINT  size);


void
HPDF_FreeMem  (HPDF_MMgr  mmgr,
               void       *aptr);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _HPDF_MMGR_H */

